/**
 * 日期工具类
 */

/**
 * 获取当前日期，格式为YYYY-MM-DD
 * @returns {String} 当前日期字符串
 */
export const getCurrentDate = () => {
  const now = new Date()
  const year = now.getFullYear()
  const month = (now.getMonth() + 1).toString().padStart(2, '0')
  const day = now.getDate().toString().padStart(2, '0')
  return `${year}-${month}-${day}`
}

/**
 * 获取指定日期之前的日期
 * @param {Number} days 天数
 * @param {Date} date 基准日期，默认为今天
 * @returns {String} 日期字符串，格式为'YYYY-MM-DD'
 */
export const getDateBefore = (days, date = new Date()) => {
  const result = new Date(date)
  result.setDate(result.getDate() - days)
  return formatDate(result)
}

/**
 * 格式化日期
 * @param {String|Date} date 日期字符串或日期对象
 * @param {String} format 格式，默认为'YYYY-MM-DD'
 * @returns {String} 格式化后的日期字符串
 */
export const formatDate = (date, format = 'YYYY-MM-DD') => {
  if (!date) return ''
  
  const d = typeof date === 'string' ? new Date(date) : date
  
  const year = d.getFullYear()
  const month = d.getMonth() + 1
  const day = d.getDate()
  const hours = d.getHours()
  const minutes = d.getMinutes()
  const seconds = d.getSeconds()
  
  const pad = (n) => (n < 10 ? '0' + n : n)
  
  return format
    .replace('YYYY', year)
    .replace('MM', pad(month))
    .replace('DD', pad(day))
    .replace('HH', pad(hours))
    .replace('mm', pad(minutes))
    .replace('ss', pad(seconds))
}

/**
 * 获取友好的日期显示
 * @param {String} dateStr 日期字符串，格式为'YYYY-MM-DD'
 * @returns {String} 友好的日期显示
 */
export const formatDateFriendly = (dateStr) => {
  if (!dateStr) return ''
  
  const today = new Date()
  const todayStr = formatDate(today)
  
  if (dateStr === todayStr) {
    return '今天'
  }
  
  const yesterday = new Date(today)
  yesterday.setDate(yesterday.getDate() - 1)
  const yesterdayStr = formatDate(yesterday)
  
  if (dateStr === yesterdayStr) {
    return '昨天'
  }
  
  const date = new Date(dateStr)
  const day = date.getDay()
  const dayNames = ['周日', '周一', '周二', '周三', '周四', '周五', '周六']
  
  // 如果是本周
  const firstDayOfWeek = new Date(today)
  firstDayOfWeek.setDate(today.getDate() - today.getDay())
  
  if (date >= firstDayOfWeek) {
    return dayNames[day]
  }
  
  // 如果是本月
  if (date.getMonth() === today.getMonth() && date.getFullYear() === today.getFullYear()) {
    return `${date.getMonth() + 1}月${date.getDate()}日`
  }
  
  // 其他日期
  return dateStr
}

/**
 * 获取指定日期之后的日期
 * @param {Number} days 天数
 * @param {Date} date 基准日期，默认为今天
 * @returns {String} 日期字符串，格式为'YYYY-MM-DD'
 */
export const getDateAfter = (days, date = new Date()) => {
  const result = new Date(date)
  result.setDate(result.getDate() + days)
  return formatDate(result)
}

/**
 * 获取两个日期之间的天数
 * @param {String|Date} date1 日期1
 * @param {String|Date} date2 日期2
 * @returns {Number} 天数
 */
export const getDaysBetween = (date1, date2) => {
  const d1 = typeof date1 === 'string' ? new Date(date1) : date1
  const d2 = typeof date2 === 'string' ? new Date(date2) : date2
  
  // 转换为UTC时间以消除时区影响
  const utc1 = Date.UTC(d1.getFullYear(), d1.getMonth(), d1.getDate())
  const utc2 = Date.UTC(d2.getFullYear(), d2.getMonth(), d2.getDate())
  
  // 一天的毫秒数
  const MS_PER_DAY = 1000 * 60 * 60 * 24
  
  // 计算差值并转换为天数
  return Math.floor((utc2 - utc1) / MS_PER_DAY)
}

/**
 * 判断是否是同一天
 * @param {String|Date} date1 日期1
 * @param {String|Date} date2 日期2
 * @returns {Boolean} 是否是同一天
 */
export const isSameDay = (date1, date2) => {
  const d1 = typeof date1 === 'string' ? new Date(date1) : date1
  const d2 = typeof date2 === 'string' ? new Date(date2) : date2
  
  return d1.getFullYear() === d2.getFullYear() &&
         d1.getMonth() === d2.getMonth() &&
         d1.getDate() === d2.getDate()
}

/**
 * 计算两个日期之间的天数差
 * @param {Date|String} date1 第一个日期
 * @param {Date|String} date2 第二个日期
 * @returns {Number} 天数差
 */
export const getDaysDiff = (date1, date2) => {
  // 确保是日期对象
  if (typeof date1 === 'string') {
    date1 = new Date(date1)
  }
  if (typeof date2 === 'string') {
    date2 = new Date(date2)
  }
  
  // 转换为UTC时间戳，忽略时区和时分秒
  const utcDate1 = Date.UTC(date1.getFullYear(), date1.getMonth(), date1.getDate())
  const utcDate2 = Date.UTC(date2.getFullYear(), date2.getMonth(), date2.getDate())
  
  // 计算天数差
  return Math.floor((utcDate2 - utcDate1) / (1000 * 60 * 60 * 24))
}

/**
 * 获取两个日期之间的日期数组
 * @param {Date|String} startDate 开始日期
 * @param {Date|String} endDate 结束日期
 * @param {String} format 返回日期格式
 * @returns {Array} 日期数组
 */
export const getDatesBetween = (startDate, endDate, format = 'YYYY-MM-DD') => {
  // 确保是日期对象
  if (typeof startDate === 'string') {
    startDate = new Date(startDate)
  }
  if (typeof endDate === 'string') {
    endDate = new Date(endDate)
  }
  
  const dates = []
  const currentDate = new Date(startDate)
  
  // 确保开始日期不晚于结束日期
  if (currentDate > endDate) {
    return dates
  }
  
  // 生成日期数组
  while (currentDate <= endDate) {
    dates.push(formatDate(currentDate, format))
    currentDate.setDate(currentDate.getDate() + 1)
  }
  
  return dates
}

/**
 * 获取一周中的星期几
 * @param {Date|String} date 日期
 * @param {Boolean} isChinese 是否返回中文星期
 * @returns {String} 星期几
 */
export const getDayOfWeek = (date, isChinese = true) => {
  // 确保是日期对象
  if (typeof date === 'string') {
    date = new Date(date)
  }
  
  const dayIndex = date.getDay() // 0=星期日，1=星期一，...
  
  if (isChinese) {
    const chineseDays = ['星期日', '星期一', '星期二', '星期三', '星期四', '星期五', '星期六']
    return chineseDays[dayIndex]
  } else {
    const englishDays = ['Sun', 'Mon', 'Tue', 'Wed', 'Thu', 'Fri', 'Sat']
    return englishDays[dayIndex]
  }
}

export default {
  getCurrentDate,
  getDateBefore,
  formatDate,
  getDaysDiff,
  getDatesBetween,
  getDayOfWeek
} 